home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork3.lzh / サンプル実用編 / ペイント / GPTOOL.C < prev    next >
Text File  |  1994-03-10  |  17KB  |  534 lines

  1. /******************************************************************************
  2.  *    gpTool.c:    ツール選択ウィンドウ関係のモジュール
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1994 SHARP
  5.  */
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <console.h>        /* コンソール系マネージャを利用するときに必要 */
  9. #include <event.h>        /* イベントマンを利用するときに必要    */
  10. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  11. #include <control.h>        /* コントロールマンを利用するときに必要    */
  12. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  13. #include <task.h>        /* タスクマンを利用するときに必要    */
  14. #include "gpaint.h"        /* このプログラム固有のヘッダファイル    */
  15.  
  16. /******************************************************************************
  17.  *    toolMsLDown():    ツール選択ウィンドウでのマウスレフトダウン処理
  18.  ******************************************************************************
  19.  *    引数:    ComVal *pcv    共通変数へのポインタ
  20.  */
  21. void toolMsLDown(ComVal *pcv)
  22. {
  23.     int partCode, sno, wno, kind;
  24.     Control **ctrlHdl;        /* コントロールハンドル        */
  25.  
  26.     /* マウスのボタンが押されている間、コントロールの各種処理をシステムに
  27.        任せて、コントロールハンドルとボタンが押された、または離された場所
  28.        のパートコードを取得する */
  29.     partCode = SXCallCtrlM(&pcv->subwinPtr[TOOL]->win, &pcv->event, 0, 0, NULL, &ctrlHdl);
  30.  
  31.     /* ツールがペン、ブラシ、ルーペなら再設定する */
  32.     if ((pcv->toolKind == 0 || pcv->toolKind == 2
  33.      || (pcv->toolKind == 4 && pcv->lupeStat == 1
  34.      && (HIWORD(pcv->toolStat[4]) == 0))) && partCode == C_INTHUMB) {
  35.         if (ctrlHdl == pcv->slvHHdl) {
  36.             if (pcv->toolKind != 2)
  37.                 pcv->penSize.p.x = CMValueGet(ctrlHdl);
  38.             else
  39.                 pcv->brushSize.p.x = CMValueGet(ctrlHdl);
  40.         } else if (ctrlHdl == pcv->slvVHdl) {
  41.             if (pcv->toolKind != 2)
  42.                 pcv->penSize.p.y = CMValueGet(ctrlHdl);
  43.             else
  44.                 pcv->brushSize.p.y = CMValueGet(ctrlHdl);
  45.         }
  46.         /* 現在の縦、横幅によるペン、ブラシのイメージを描画する */
  47.         drawNowImg(pcv);
  48.     } else {
  49.         kind = selectTool(pcv, &sno);
  50.         /* ツールのとき */
  51.         switch (kind) {
  52.         case 0:
  53.             /* 選択されたツールがルーペ、または選択されてるツール
  54.                と違うツールが選択されたか? */
  55.             if (sno == 4 || sno != pcv->toolKind)
  56.                 /* ツールの選択番号を変更する */
  57.                 changeTool(pcv, sno);
  58.             break;
  59.         case 1:
  60.             wno = pcv->toolStat[pcv->toolKind];
  61.             /* ルーペなら */
  62.             if (pcv->toolKind == 4) /* ツールボタンか? */
  63.                 /* 上位の16ビット */
  64.                 wno = LOWWORD(wno >> pcv->lupeStat * 16);
  65.             changeToolSubBtn(pcv, sno);
  66.             break;
  67.         }
  68.     }
  69. }
  70.  
  71. /******************************************************************************
  72.  *    drawToolWnd():    ツール選択ウィンドウの描画
  73.  ******************************************************************************
  74.  *    引数:    ComVal *pcv    共通変数へのポインタ
  75.  */
  76. void drawToolWnd(ComVal *pcv)
  77. {
  78.     int i;
  79.     Rect rc;
  80.  
  81.     drawSubwin(pcv, TOOL);        /* サブウィンドウを描画する    */
  82.  
  83.     /* ツール選択ウィンドウをテキストタイプでカレントグラフにする */
  84.     setGraph(&pcv->subwinPtr[TOOL]->win, G_TXT);
  85.  
  86.     GMAPage(G_PAGE0 | G_PAGE1);    /* アクセスページを0と1ページにする */
  87.     for (i = 0; i < 8; i++) {
  88.         calcToolPctBtn(i, &rc);
  89.         if (i < TOOLMAX) {
  90.             /* 選択されているツールならピクチャーボタンを表示する */
  91.             GMPutRImg(*pcv->tlBtnImg[i], rc.l.l_t);
  92.             if (i == pcv->toolKind)
  93.                 revFrameRect(&rc);
  94.         } else
  95.             /* 予備のアイコンには使用不可のボタンを描く */
  96.             plusRectImg(pcv->tlBtnImg[14], 0, 0, rc.l.l_t, 2);
  97.     }
  98.     /* ツール選択ウィンドウをテキストタイプでカレントグラフにする */
  99.     setGraph(&pcv->subwinPtr[TOOL]->win, G_TXT);
  100.     /* ツールボタンを描画する */
  101.     drawToolSubBtn(pcv, pcv->toolKind);
  102.     /* コントロールを表示する */
  103.     drawToolCtrl(pcv);
  104. }
  105.  
  106. /******************************************************************************
  107.  *    drawToolCtrl():    ツール選択ウィンドウでのコントロールの描画
  108.  ******************************************************************************
  109.  *    引数:    ComVal *pcv    共通変数へのポインタ
  110.  */
  111. void drawToolCtrl(ComVal *pcv)
  112. {
  113.     static Rect rcbm1 = { 26, WS_INSIDE_Y + 50, 164, WS_INSIDE_Y + 70 };
  114.     static Rect rcbm2 = { 4, WS_INSIDE_Y + 50, 24, WS_INSIDE_Y + 70 };
  115.  
  116.     GMForeColor(G_BLACK);        /* フォアグラウンドカラーを黒にする */
  117.     /* バックグラウンドカラーをライトグレーにする */
  118.     GMBackColor(G_LGRAY);
  119.     /* 描画モードをPSETモードにする */
  120.     GMPenMode(G_PSET);
  121.     GMAPage(G_PAGE0 | G_PAGE1);    /* アクセスページを0と1ページにする */
  122.  
  123.     /* ツールがペン、ブラシ、ルーペならコントロールを表示する */
  124.     if (pcv->toolKind == 0 || pcv->toolKind == 2
  125.      || (pcv->toolKind == 4 && pcv->lupeStat == 1
  126.      && HIWORD(pcv->toolStat[4]) == 0)) {
  127.  
  128.         GMShadowRect(&rcbm1);
  129.         /* 影付きレクタングルを表示する */
  130.         GMShadowRect(&rcbm2);
  131.  
  132.         /* フォントモードのセット */
  133.         GMFontMode(G_PSET);
  134.         /* 文字表示開始位置の設定 */
  135.         GMShadowStrZ("幅", LONGWORD( 28, WS_INSIDE_Y + 2 + 52));
  136.         GMShadowStrZ("横", LONGWORD( 48, WS_INSIDE_Y + 2 + 52));
  137.         GMShadowStrZ("縦", LONGWORD(108, WS_INSIDE_Y + 2 + 52));
  138.         if (pcv->toolKind != 2) {
  139.             /* ツールがペン、ルーペならば現在のペンサイズを設定
  140.                する */
  141.             CMValueSet(pcv->slvHHdl, (int) pcv->penSize.p.x);
  142.             CMValueSet(pcv->slvVHdl, (int) pcv->penSize.p.y);
  143.         } else {
  144.             /* ツールがブラシならば現在のブラシサイズを設定する */
  145.             CMValueSet(pcv->slvHHdl, (int) pcv->brushSize.p.x);
  146.             CMValueSet(pcv->slvVHdl, (int) pcv->brushSize.p.y);
  147.         }
  148.         /* 現在の縦、横幅によるペン、ブラシのイメージを描画する */
  149.         drawNowImg(pcv);
  150.     } else {
  151.         GMShadowRect(&rcbm1);
  152.  
  153.         GMBackColor(G_DGRAY);    /* ペン幅表示不能のため */
  154.         GMShadowRect(&rcbm2);
  155.  
  156.         GMBackColor(G_LGRAY);
  157.         /* 文字表示開始位置の設定 */
  158.         GMShadowStrZ("幅", LONGWORD( 28, WS_INSIDE_Y + 2 + 52));
  159.         GMShadowStrZ("横", LONGWORD( 48, WS_INSIDE_Y + 2 + 52));
  160.         GMShadowStrZ("縦", LONGWORD(108, WS_INSIDE_Y + 2 + 52));
  161.         /* サムの位置を一番左に */
  162.         CMValueSet(pcv->slvHHdl, 0);
  163.         CMValueSet(pcv->slvVHdl, 0);
  164.     }
  165.     CMDraw(&pcv->subwinPtr[TOOL]->win);
  166. }
  167.  
  168. /******************************************************************************
  169.  *    drawNowImg():    現在の縦、横幅によるペン、ブラシのイメージを描画する
  170.  ******************************************************************************
  171.  *    引数:    ComVal *pcv    共通変数へのポインタ
  172.  */
  173. void drawNowImg(ComVal *pcv)
  174. {
  175.     int i, j, k, l;
  176.     BitImg *wPtr;
  177.     BitImg workbmp[16];
  178.     BitImg swork;
  179.     Point pt;
  180.     Rect rc;
  181.  
  182.     static Rect rcdraw = { 6, WS_INSIDE_Y + 52, 22, WS_INSIDE_Y + 68 };
  183.     static BitImg bitcut[16] = {
  184.              0, 0x0080, 0x0808, 0x2082, 0x2222, 0x2492, 0x294a, 0x2aaa,
  185.         0x5555, 0x6aab, 0x7367, 0x6ddb, 0x7777, 0x7ddf, 0x7f7f, 0xffff
  186.     };
  187.  
  188.     GMPenMode(G_PSET); /* 描画モードをP_SETモードにする */
  189.     /* フォアグラウンドカラーをライトグレーにする */
  190.     GMForeColor(G_LGRAY);
  191.     GMFillRect(&rcdraw);        /* 描画領域の塗りつぶし        */
  192.     GMForeColor(G_BLACK);        /* フォアグラウンドカラーを黒にする */
  193.     GMAPage(G_PAGE0 | G_PAGE1);    /* アクセスページを0と1ページにする */
  194.  
  195.     if (pcv->toolKind != 2) {    /* ツールがペン、ルーペか? */
  196.         /* 描画開始点の算出 */
  197.         pt.p.x = 6 + 8 - (pcv->penSize.p.x >> 1);
  198.         pt.p.y = WS_INSIDE_Y + 52 + 8 - (pcv->penSize.p.y >> 1);
  199.  
  200.         /* ペンサイズを設定する */
  201.         OldPS.x_y = GMPenSize(pcv->penSize.x_y);
  202.         /* 描画エリアに点を描画 */
  203.         GMMove(pt.x_y);
  204.         GMLine(pt.x_y);
  205.         /* ペンサイズを元に戻す */
  206.         GMPenSize(OldPS.x_y);
  207.     } else {            /* ツールがブラシなら        */
  208.  
  209.         pt.x_y = 0;
  210.         if (pcv->brushSize.p.x != 16)
  211.             pt.p.x = 16 - pcv->brushSize.p.x;
  212.         if (pcv->brushSize.p.y != 16)
  213.             pt.p.y = 16 - pcv->brushSize.p.y;
  214.  
  215.         /* 選択されているブラシのビットイメージへのポインタを取得する */
  216.         wPtr = &(*pcv->penImg[pcv->toolStat[2]])->data[16];
  217.         /* ブラシの幅が16×16でなければ */
  218.         /* 縮小されたブラシのビットイメージを作成する */
  219.         l = 0;            /* ワーク領域の縦方向インデックス */
  220.         i = 0;            /* 元ビットイメージの縦方向インデックス */
  221.         workbmp[0] = 0;    /* ワーク領域のクリア */
  222.  
  223.         while (pt.x_y != 0) {
  224.             j = 0;        /* 元ビットイメージの横方向のビット位置 */
  225.             k = 0;        /* ワーク領域の横方向のビット位置 */
  226.             while (1) {
  227.                 /* ビットがオンかどうかを調べ、オンならその */
  228.                 /* ビットデータを取得する */
  229.                 if ((swork = wPtr[i] & (0x8000 >> j)) != 0)
  230.                     swork = 0x8000 >> k;
  231.                 /* ワーク領域に新しい(縮小された)イメージを取得する */
  232.                 workbmp[l] |= swork;
  233.                 j++;    /* 元イメージのビット位置の更新    */
  234.                 if (j == 16)
  235.                     break;
  236.                 /* ビットのカットをするビットでなければ */
  237.                 /* ビットのコピー位置を1ビット更新 */
  238.                 if ((bitcut[pt.p.x] & (0x8000 >> j)) == 0)
  239.                     k++;
  240.             }
  241.             i++;        /* 元イメージの縦方向インデックスの更新 */
  242.             if (i == 16) {
  243.                 /* 全イメージを縮小コピーしたら */
  244.                 for (j = l + 1; j < 16; j++)
  245.                     /* ワーク領域の残りをクリア */
  246.                     workbmp[j] = 0;
  247.                 /* ポインタをワーク領域に設定する */
  248.                 wPtr = workbmp;
  249.                 /* ループ終了 */
  250.                 break;
  251.             }
  252.             /* 縦方向ビットのカットをするビットでなければ */
  253.             /* 縦方向ビットのコピー位置を1ビット更新 */
  254.             if ((bitcut[pt.p.y] & (0x8000 >> i)) == 0) {
  255.                 l++;
  256.                 /* ワーク領域のクリア */
  257.                 workbmp[l] = 0;
  258.             }
  259.         }
  260.  
  261.         /* 描画レクタングルの算出 */
  262.         rc.d.left = 6 + 8 - (pcv->brushSize.p.x >> 1);
  263.         rc.d.right = rc.d.left + 16 - pt.p.x;
  264.         rc.d.top = WS_INSIDE_Y + 52 + 8 - (pcv->brushSize.p.y >> 1);
  265.         rc.d.bottom = rc.d.top + 16 - pt.p.y;
  266.  
  267.         /* ブラシのイメージを描画する */
  268.         GMFillImg(wPtr, &rc);
  269.         /* ブラシのイメージデータを保存する */
  270.         memcpy(pcv->brushImg, wPtr, 32);
  271.     }
  272. }
  273.  
  274. /******************************************************************************
  275.  *    selectTool():    ツールの選択状態のチェック
  276.  ******************************************************************************
  277.  *    引数:    ComVal *pcv    共通変数へのポインタ
  278.  *        int *pnum    選択されたツールの番号を格納するポインタ
  279.  *    戻り値:    int        = 0: メイン(上段)のピクチャーボタンが選択された
  280.  *                = 1: サブ(下段)のピクチャーボタンが選択された
  281.  *                < 0: 選択なし
  282.  *    注釈:    選択されたアイテムの種類と、ツールの番号を返します。
  283.  */
  284. int selectTool(ComVal *pcv, int *pnum)
  285. {
  286.     int i;
  287.     unsigned short sWork;
  288.     LPoint lpt;
  289.     Rect rc;
  290.  
  291.     /* ツール選択ウィンドウのツールボタンが選択されているときのサブボタン
  292.        の状態 */
  293.     static unsigned short toolBmpInf[8] = {
  294.         0xfc, 0x7c, 0xff, 0x80, 0xc0, 0, 0, 0
  295.     };
  296.  
  297.     /* 入力座標をローカル座標系に変換する */
  298.     lpt = GMGlobalToLocal(pcv->event.ev.where.x_y);
  299.     *pnum = -1;
  300.     /* 押された所がどの部分か調べる */
  301.     for (i = 0; i < TOOLMAX; i++) {
  302.         calcToolPctBtn(i, &rc);
  303.         if (GMPtInRect(&rc, lpt)) {
  304.             *pnum = i;
  305.             return 0;    /* 選択されたツールの番号を返す */
  306.         }
  307.     }
  308.  
  309.     for (i = 0; i < 8; i++) {
  310.         sWork = toolBmpInf[pcv->toolKind];
  311.         sWork = (sWork >> (7 - i)) & 0x0001;
  312.         if (sWork != 0) {
  313.             calcToolPctBtn(i + 8, &rc);
  314.             if (GMPtInRect(&rc, lpt)) {
  315.                 *pnum = i;
  316.                 return 1; /* 選択されているツールが選択された */
  317.             }
  318.         }
  319.     }
  320.  
  321.     return -1;
  322. }
  323.  
  324. /******************************************************************************
  325.  *    calcToolPctBtn():    ピクチャーボタンの位置を算出(ツールウィンドウ)
  326.  ******************************************************************************
  327.  *    引数:    int num        表示するピクチャーボタン番号(0~7, 8~15)
  328.  *        Rect *prc    表示位置のレクタングルを格納するポインタ
  329.  */
  330. void calcToolPctBtn(int num, Rect *prc)
  331. {
  332.     Point pt;
  333.  
  334.     *prc = pb1size;
  335.     pt.p.y = WS_INSIDE_Y + 2;
  336.     if (num >= 8) {
  337.         num -= 8;
  338.         pt.p.y += 24;
  339.     }
  340.     pt.p.x = 4 + num * 20;
  341.     GMSlideRect(prc, pt.x_y);
  342. }
  343.  
  344. /******************************************************************************
  345.  *    changeTool():    上段のピクチャーボタンを変更
  346.  ******************************************************************************
  347.  *    引数:    ComVal *pcv    共通変数へのポインタ
  348.  *        int num        メインのピクチャーボタン番号
  349.  */
  350. void changeTool(ComVal *pcv, int num)
  351. {
  352.     int wno;
  353.     Rect rc;
  354.  
  355.     /* ツール選択ウィンドウをテキストタイプでカレントグラフにする */
  356.     setGraph(&pcv->subwinPtr[TOOL]->win, G_TXT);
  357.  
  358.     GMAPage(G_PAGE0 | G_PAGE1);    /* アクセスページを0と1ページにする */
  359.     wno = pcv->toolKind;
  360.  
  361.     /* 元に戻す */
  362.     calcToolPctBtn(pcv->toolKind, &rc);
  363.     revFrameRect(&rc);
  364.     /* フレームを反転 */
  365.     calcToolPctBtn(num, &rc);
  366.     revFrameRect(&rc);
  367.     pcv->toolKind = num;
  368.  
  369.     if (num == 4) {
  370.         /* ルーペが選択された */
  371.         if (pcv->toolKind == 4)
  372.             /* 今回もルーペなら倍率選択とツール選択の切り替え */
  373.             pcv->lupeStat = (pcv->lupeStat & 1) ^ 1;
  374.         if (pcv->subwinPtr[LUPE] == NULL) {
  375.             /* ルーペウィンドウの表示 */
  376.             if (!openSubwin(pcv, 3)) {
  377.                 /* サブウィンドウが作成できなかった */
  378.                 DMError(D_CONFIRM, "ルーペウィンドウがオープンできません。");
  379.                 return;
  380.             }
  381.             dispLupeRect(pcv); /* 拡大エリアの表示        */
  382.             /* ルーペの拡大範囲の移動禁止フラグをクリア*/
  383.             pcv->moveLock = FALSE;
  384.             pcv->lupeTool = wno; /* 直前のツールの種類を保存する */
  385.         }
  386.     } else if (pcv->subwinPtr[LUPE] != NULL) {
  387.         /* サブウィンドウが作成されていれば */
  388.         dispLupeRect(pcv);    /* 拡大エリアの消去        */
  389.         disposeSubwin(pcv, 3);    /* サブウィンドウの消去        */
  390.     }
  391.     /* ツール選択ウィンドウをカレントグラフにする */
  392.     GMSetGraph(&pcv->subwinPtr[TOOL]->win.graph);
  393.  
  394.     GMAPage(G_PAGE0 | G_PAGE1);    /* アクセスページを0と1ページにする */
  395.     /* 下段のピクチャーボタンの描画 */
  396.     drawToolSubBtn(pcv, num);
  397.     /* ペンの大きさ設定のアイテムの描画 */
  398.     drawToolCtrl(pcv);
  399. }
  400.  
  401. /******************************************************************************
  402.  *    changeToolSubBtn():    下段のピクチャーボタンを変更
  403.  ******************************************************************************
  404.  *    引数:    ComVal *pcv    共通変数へのポインタ
  405.  *        int num        サブのピクチャーボタンボタン番号
  406.  */
  407. void changeToolSubBtn(ComVal *pcv, int num)
  408. {
  409.     int newno, oldno;
  410.     LPoint lpt;
  411.     Rect rc;
  412.  
  413.     if (pcv->toolKind == 3) {
  414.         /* 消しゴムが選択されていた場合 */
  415.         if (num == 0) {
  416.             /* NEWボタンのチェック */
  417.             calcToolPctBtn(num + 8, &rc);
  418.             lpt = EMMSLoc();
  419.             if (checkPctBtn(pcv, &rc, lpt, 0))
  420.                 /* 絵の消去の実行 */
  421.                 newPicture(pcv);
  422.             return;
  423.         }
  424.     }
  425.     newno = num;
  426.     oldno = pcv->toolStat[pcv->toolKind];
  427.     if (pcv->toolKind == 4) {
  428.         oldno = LOWWORD(pcv->toolStat[pcv->toolKind] >> pcv->lupeStat * 16);
  429.         newno = num << (pcv->lupeStat * 16);
  430.         newno |= pcv->toolStat[4] & 1 << (pcv->lupeStat ^ 1) * 16;
  431.     }
  432.     /* ピクチャーボタンの番号が変更されている */
  433.     if (pcv->toolStat[pcv->toolKind] != newno) {
  434.     /* 選択されたピクチャーボタンのフレームを反転 */
  435.         /* 元に戻す */
  436.         calcToolPctBtn(oldno + 8, &rc);
  437.         revFrameRect(&rc);
  438.         /* フレームを反転 */
  439.         calcToolPctBtn(num + 8, &rc);
  440.         revFrameRect(&rc);
  441.  
  442.         /* 選択された番号を保存する */
  443.         pcv->toolStat[pcv->toolKind] = newno;
  444.         if (pcv->toolKind == 4) /* ルーペの場合 */
  445.             /* ルーペの拡大倍率を変更 */
  446.             changeLupeRate(pcv, num);
  447.  
  448.         /* ツール選択ウィンドウをカレントグラフにする */
  449.         GMSetGraph(&pcv->subwinPtr[TOOL]->win.graph);
  450.  
  451.         /* アクセスページを0と1ページにする */
  452.         GMAPage(G_PAGE0 | G_PAGE1);
  453.         /* ペンの大きさ設定のアイテムの描画 */
  454.         drawToolCtrl(pcv);
  455.     }
  456. }
  457.  
  458. /******************************************************************************
  459.  *    drawToolSubBtn():    サブのピクチャーボタンの描画
  460.  ******************************************************************************
  461.  *    引数:    ComVal *pcv    共通変数へのポインタ
  462.  *        int num        サブのピクチャーボタン番号
  463.  */
  464. void drawToolSubBtn(ComVal *pcv, int num)
  465. {
  466.     int i;
  467.     Rect rc;
  468.  
  469.     GMAPage(G_PAGE0 | G_PAGE1);    /* アクセスページを0と1ページにする */
  470.     switch (num) {
  471.     case 0:                /* 鉛筆            */
  472.         for (i = 0; i < 8; i++) {
  473.             calcToolPctBtn(i + 8, &rc);
  474.             if (i < 6 ) {
  475.                 GMPutRImg(*pcv->tlBtnImg[i + 5], rc.l.l_t);
  476.                 if (pcv->toolStat[num] == i)
  477.                     revFrameRect(&rc);
  478.             } else
  479.                 plusRectImg(pcv->tlBtnImg[14], 0, 0, rc.l.l_t, 2);
  480.         }
  481.         break;
  482.     case 1:                /* 塗りつぶし        */
  483.         for (i = 0; i < 8; i++) {
  484.             calcToolPctBtn(i + 8, &rc);
  485.             if (i != 0 && i < 6 ) {
  486.                 GMPutRImg(*pcv->tlBtnImg[i + 5], rc.l.l_t);
  487.                 if (pcv->toolStat[num] == i)
  488.                     revFrameRect(&rc);
  489.             } else {
  490.                 if (i == 0)
  491.                     plusRectImg(pcv->tlBtnImg[14], pcv->tlBtnImg[5], 0, rc.l.l_t, 2);
  492.                 else
  493.                     plusRectImg(pcv->tlBtnImg[14], 0, 0, rc.l.l_t, 2);
  494.             }
  495.         }
  496.         break;
  497.     case 2:                /* ブラシ        */
  498.         for (i = 0; i < 8; i++) {
  499.             calcToolPctBtn(i + 8, &rc);
  500.             plusRectImg(pcv->tlBtnImg[14], pcv->penImg[i], LONGWORD(2, 2), rc.l.l_t, 0);
  501.             if (pcv->toolStat[num] == i)
  502.                 revFrameRect(&rc);
  503.         }
  504.         break;
  505.     case 3:                /* 消しゴム        */
  506.         calcToolPctBtn(0 + 8, &rc);
  507.         GMPutRImg(*pcv->tlBtnImg[11], rc.l.l_t);
  508.         for (i = 1; i < 8; i++) {
  509.             calcToolPctBtn(i + 8, &rc);
  510.             plusRectImg(pcv->tlBtnImg[14], 0, 0, rc.l.l_t, 2);
  511.         }
  512.         break;
  513.     case 4:                /* ルーペ        */
  514.         for (i = 0; i < 8; i++) {
  515.             calcToolPctBtn(i + 8, &rc);
  516.             if (i < 2) {
  517.                 if (pcv->lupeStat) {
  518.                     /* ルーペのツール選択 */
  519.                     GMPutRImg(*pcv->tlBtnImg[i], rc.l.l_t);
  520.                     if (HIWORD(pcv->toolStat[4]) == i)
  521.                         revFrameRect(&rc);
  522.                 } else {
  523.                     /* ルーペの倍率選択 */
  524.                     GMPutRImg(*pcv->tlBtnImg[i + 12], rc.l.l_t);
  525.                     if (LOWWORD(pcv->toolStat[4]) == i)
  526.                         revFrameRect(&rc);
  527.                 }
  528.             } else
  529.                 plusRectImg(pcv->tlBtnImg[14], 0, 0, rc.l.l_t, 2);
  530.         }
  531.         break;
  532.     }
  533. }
  534.